package com.yoda.youdianda.common;

import lombok.Data;

/**
 * @Author ManySisters
 * @create 2023-02-10 16:49
 */

/**
 * 通用返回结果，服务端响应的数据最终都会封装成此对象
 * <T> : 表示定义一个不确定的类型
 *  T  : 表示在使用一个不确定的类型
 *  核心： 泛型在定义时不确定，在使用时确定！
 *  class R<T>： 泛型类
 *              特点：定义类时要操作的元素类型不确定！ 使用类时（创建对象）时才确定！
 *  public static <E> R<E> success(E object)： 静态泛型方法！
 *              特点： 定义方法时要操作的元素类型不确定！调用方法时才确定！
 */
@Data
public class R <T>{
    private Integer errno;  //成功:0,失败:1
    private String errmsg; //错误信息
    private T data; //数据

    /**
     * 响应成功的结果
     * <E>: 在方法的返回值前面写一个<E>，表示声明当前方法是一个泛型方法
     * 注意： 由于当前方法是一个静态方法，可以脱离对象单独调用，所以不能沿用类名后面的<T>，所以必须单独声明泛型！
     * @param object
     * @param <E>
     * @return
     */
    public static <E> R<E> success(E object){
        R<E> r = new R<>();
        r.data = object;
        r.errno = 0;
        return r;
    }

    /**
     * 响应失败的结果
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> R<T> error(String msg){
        R<T> r =  new R<>();
        r.errmsg = msg;
        r.errno = 1;
        return r;
    }
}
